抽象指的是當今天一個super class
有很多的sub class
時,本身所提供的方法
可能已經不符合每一個sub class
所要做的事情了,這時候可以使用抽象
的概念,將super class
轉換為抽象類
,並且在每一個sub class
將super class
中的方法重寫
。
使用abstract
可以將類轉為抽象,加上abstract
的class
是不能
使用new Person()
的方式將其實例化
。
public abstract class Person {}
public class Student extends Person {}
在方法
前加上abstract
也可以將方法變為抽象方法
,這時的方法是不可以包含程式碼區塊
的,且當class
中有abstract method
時,該class
也需要變為abstract class
。
public abstract class Person {
public abstract void eat();
}
public class Student extends Person {
public void eat() {
System.out.println("I am eatting");
}
}
💡當繼承抽象類
時,要小心一定得將super class
中的抽象方法
實現,否則這個sub class
也會成為一個抽象類
,那就無法正常使用它了。
abstract
不能跟這些一起使用:
private
的方法:不可以被重寫靜態方法
:靜態方法
可以透過class
本身去使用,這樣就違反了abstract method
沒有程式碼區塊
的部分final
的方法:使用final
的方法無法被重寫,abstract
強調的是透過sub class
重寫方法final
的類:使用final
的類無法被繼承,這也違反了abstract
的用法舉例使用:
Person
的super class
,當中屬性
有String name
、int age
、int height
、int weight
,並且有一個抽象的方法
是String introduce
。Student
的sub class
,當中屬性
有String school
,有兩個構造器
。Teacher
的sub class
,當中當中屬性
有String teach
,有兩個構造器
。public abstract class Person {
String name;
int age;
int height;
int weight;
public abstract String introduce();
}
public class Student extends Person {
String school;
public Student() {};
public Student(String name, int age, int height, int weight, String school) {
super(name, age, height, weight);
this.school = school;
}
public String introduce() {
return "I am " + name + ", I am " + age + " years old. I study in" + school + ".";
}
}
public class Teacher extends Person {
String teach;
public Teacher() {};
public Teacher(String name, int age, int height, int weight, String teach) {
super(name, age, height, weight);
this.teach = teach;
}
public String introduce() {
return "I am " + name + ", I am " + age + " years old. I teach" + teach + ".";
}
}
public class School {
public static void main(String[] args) {
Person[] person = new Person[2];
person[0] = new Student("Tom", 15, 187, 78, "Hello School");
person[1] = new Teacher("Amy", 27, 153, 42, "Math");
for(int i = 0; i < person.length; i++) {
System.out.println(person[i].introduce());
}
}
}
I am Tom, I am 15 years old. I study in Hello School.
I am Amy, I am 27 years old. I teach Math.
可以看到這邊使用多態
的方式去宣告一個Person
的陣列
,但是每一個內容則是使用sub class
去建立。